﻿using System;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Windows.Shell;

namespace Host.Encriptacion.logica
{
    class AlgoritmoCFB
    {
        AlgoritmoCFB() { }


        public static BitArray[] ENTRADA;
        public static BitArray[] ENTRADA_ENCRIPTADA;
        public static string CLAVEUSUARIO;
        public static BitArray[] FINAL;
        public static BitArray[] NORMAL;


        public static BitArray[] CFB_Encriptar(BitArray[] entrada, string claveUsuario)
        {
            ENTRADA = entrada;
            CLAVEUSUARIO = claveUsuario;

            IO.ImprimePasos("Comienza el algoritmo CFB...");
            BitArray[] final = new BitArray[ENTRADA.Length];
            BitArray IV = new BitArray(64);
            IO.ImprimePasos("IV:\n" + IO.BitArrayToString(IV, 8));
            //IO.ImprimeBitArray(IV, 8);
            BitArray[] claves = generarClave.generarClaves(CLAVEUSUARIO);
            IO.ImprimePasos("Se encriptan los trozos de 64 bits con DES en modo CFB...");
            for (int i = 0; i < ENTRADA.Length; i++)
            {
                IO.ImprimePasos("Trozo " + (i + 1));
                final[i] = XOR.xor(Encriptacion.Encriptar(IV, claves), ENTRADA[i]);
                IV = final[i];
                IO.ImprimePasos("XOR entre el trozo encriptado y el siguiente trozo\n" + IO.BitArrayToString(IV, 8));
                FINAL = final;
            }
            
            return FINAL;
        }

        public static BitArray[] CFB_Desencriptar(BitArray[] entradaEncriptada, string claveUsuario)
        {
            ENTRADA_ENCRIPTADA = entradaEncriptada;
            CLAVEUSUARIO = claveUsuario;

            IO.ImprimePasos("Comienza el algoritmo CFB...");
            BitArray[] normal = new BitArray[ENTRADA_ENCRIPTADA.Length];
            BitArray IV = new BitArray(64);
            IO.ImprimePasos("IV:\n" + IO.BitArrayToString(IV, 8));
            //IO.ImprimeBitArray(IV, 8);
            BitArray[] claves = generarClave.generarClaves(CLAVEUSUARIO);
            IO.ImprimePasos("Se encriptan los trozos de 64 bits con DES en modo CFB...");
            for (int i = 0; i < ENTRADA_ENCRIPTADA.Length; i++)
            {//dudaaaaaaaaaaaaaaaaa

                IO.ImprimePasos("Trozo " + (i + 1));
                normal[i] = XOR.xor(Encriptacion.Encriptar(IV, claves), ENTRADA_ENCRIPTADA[i]);
                IV = ENTRADA_ENCRIPTADA[i];
                IO.ImprimePasos("XOR entre el trozo encriptado y el siguiente trozo\n" + IO.BitArrayToString(IV, 8));
            }
            //IO.ImprimeBitArray(normal[entradaEncriptada.Length - 1], 8);
            NORMAL = normal;
            return NORMAL;
        }
    }
}
